#include <stdio.h>
#include <stdlib.h>

#define VO_PLL_FOUTVCO_MAX 3200
#define VO_PLL_FOUTVCO_MIN 800
#define VO_PLL_DEFAULT_REF 24
#define VO_PLL_POSTDIV_MAX 0x7
#define VO_PLL_FRACTION_PARAM 16777216 /* 2^24，用于计算像素时钟小数部分 */

typedef struct {
    unsigned int ref_div;
    unsigned int post_div1;
    unsigned int post_div2;
    unsigned int fb_div;
    unsigned int frac;
} vo_pll_parameters;

void calculate_vo_pll(vo_pll_parameters *cfg)
{
    /*
    * pixel_clk: MHz [需要设置的像素时钟]
    * 1. foutvco = pixel_clk * coef; [系数coef可为任意值，只要保证foutvco在约束值之间即可]
    * 2. pixel_clk = foutvco / (post_div1 * post_div2);
    * 3. 条件1: post_div1 > post_div2;
    * 4. foutvco = ref * (fb_div + frac / 2^24) / ref_div; [公式中的frac是一个小数，不是整数]
    * 5. 给定post_div2，计算post_div1 [判断余数是否为0，否则可能导致值偏小，进而导致逆向计算出来的pixel_clk的值偏小]
    * 6. 计算fb_div与frac 需要向上取整
    */
}